import Vue from 'vue'
import VueRouter from 'vue-router'
import Utils from '../utils'
import UserRouters from './user'

// 由于点多次路由会导致出现异常报错，解决的方案
//  1. vue-router 降级处理：npm i vue-router@3.0.7
//  2. 直接在 push 方法最后添加异常捕获：@click="router.push('/home/searchPopup').catch(err => {})"
//  3. 直接修改原型方法 push (推荐)
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function (location) {
  // 这里添加下句注释，解决 .catch() 没有进行预期错误处理引发的报错
  /* eslint handle-callback-err: "warn" */
  return originalPush.call(this, location).catch(error => {})
}
Vue.use(VueRouter)

const routes = [
]
routes.push.apply(routes, UserRouters)

const router = new VueRouter({
  // mode: 'history',
  base: process.env.BAER_URL,
  routes
})
const whiteList = ['/errorPage', '/register']
// 这里创建 '路由拦截'/'(前置)路由守卫'
router.beforeEach((to, from, next) => {
  // 开发使用
  if (Utils.testOpenId) {
    sessionStorage.setItem('openid', Utils.testOpenId)
  }
  // ? to：要去的路由
  // ? from：来的路由
  // ? next：放行函数(如果不写 next()，则不可以跳转)
  // 是不是微信中打开，不是则跳转到不是 微信认证时会自动添加 请在微信端打开
  // 白名单直接跳转
  if (whiteList.indexOf(to.path) !== -1) {
    next()
    return
  }
  if (sessionStorage.getItem('AppName')) {
    document.title = sessionStorage.getItem('AppName')
  }

  let toPath = Utils.host + '/#' + to.path
  if (to.query.id) {
    toPath += '?id=' + to.query.id
  }
  if (to.query.equipNo) {
    sessionStorage.setItem('equipNo', to.query.equipNo)// 存储设备号
  }
  if (to.query.channelNo) {
    sessionStorage.setItem('channelNo', to.query.channelNo)// 存储插座号
  }
  if (to.query.cardNo) {
    sessionStorage.setItem('cardNo', to.query.cardNo)// 存储设备号
  }

  if (Utils.isWeApp()) {
    const appId = Utils.appId
    const hrefurl = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' + appId + '&redirect_uri=' + encodeURIComponent(toPath) + '&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'

    // 从地址栏获取code
    const code = Utils.getQueryString('code')

    const isLogin = (openid) => { // 是否登录，此为java后台提供接口
      const token = sessionStorage.getItem('token')
      if (token) {
        // 有token标识登录认证过，但是可能后台的token已经过去
        next()
      } else {
        Vue.prototype.$http.get(Utils.api + '/open/welogin?openId=' + openid)
          .then(function (res) {
            if (res.code === 200) { // 已登录
              sessionStorage.setItem('token', res.msg)// 存登陆信息
              console.log(res.msg)
              window.location.href = toPath
              // setTimeout(() => {
              //   next({ path: to.path })
              // }, 200)
            } else { // 未登录
              // 此处应该跳转到注册页面(由于第三方所以跳转到别人的系统)
              // 自己系统直接
              if (res.msg === 'NoOpenId') { // 没有绑定openid
                next('/register') // 去注册页面
              } else {
                next({ path: '/errorPage', query: { msg: res.msg } })
              }
            }
          })
      }
    }
    const getOpenid = (code) => { // 获取openid，此为java后台提供接口
      Vue.prototype.$http.get(Utils.api + '/open/getWePublicCode?code=' + code)
        .then(function (res) {
          if (res.msg === 'ok') {
            sessionStorage.setItem('openid', res.data)
            isLogin(res.data)// 是否注册
          } else if (res.msg === 'NotGetWePublicCode') {
            next({ path: '/errorPage', query: { msg: '获取微信认证信息失败请关闭重试' } })
          }
        }).catch(function (error) {
          console.log(error)
        })
    }
    // 是否注册过信息~
    const openid = sessionStorage.getItem('openid')
    if (openid) {
      isLogin(openid)
    } else {
      if (code) {
        getOpenid(code) // 我把获取openid请求提出去，简单明了很多
      } else {
        window.location.replace(hrefurl)
      }
    }
  } else {
    const appId = Utils.aliAppId
    const hrefurl = 'https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=' + appId + '&redirect_uri=' + encodeURIComponent(toPath) + '&scope=auth_base'

    // 从地址栏获取code
    const code = Utils.getQueryString('auth_code')

    const isLogin = (openid) => { // 是否登录，此为java后台提供接口
      const token = sessionStorage.getItem('token')
      if (token) {
        // 有token标识登录认证过，但是可能后台的token已经过去
        next()
      } else {
        Vue.prototype.$http.get(Utils.api + '/welogin?openId=' + openid)
          .then(function (res) {
            if (res.code === 'ok') { // 已登录
              sessionStorage.setItem('token', res.msg)// 存登陆信息
              // 可能跳转太快导致token还没存入无法获取用户信息，在首页也有处理功能
              setTimeout(() => {
                next({ path: to.path })
              }, 200)
              // window.location.replace(toPath)
            } else { // 未登录
              // 此处应该跳转到注册页面(由于第三方所以跳转到别人的系统)
              // 自己系统直接
              if (res.msg === 'NoOpenId') { // 没有绑定openid
                next('/register') // 去注册页面
              } else {
                next({ path: '/errorPage', query: { msg: res.msg } })
              }
            }
          })
      }
    }
    const getOpenid = (code) => { // 获取openid，此为java后台提供接口
      Vue.prototype.$http.get(Utils.api + '/api/getWePublicCode?code=' + code)
        .then(function (res) {
          if (res.msg === 'ok') {
            sessionStorage.setItem('openid', res.data)
            isLogin(res.data)// 是否注册
          } else if (res.msg === 'NotGetWePublicCode') {
            next({ path: '/errorPage', query: { msg: '获取微信认证信息失败请关闭重试' } })
          }
        }).catch(function (error) {
          console.log(error)
        })
    }
    // 是否注册过信息~
    const openid = sessionStorage.getItem('openid')
    if (openid) {
      isLogin(openid)
    } else {
      if (code) {
        getOpenid(code) // 我把获取openid请求提出去，简单明了很多
      } else {
        window.location.replace(hrefurl)
      }
    }
  }
})

export default router
